// request 是 demo 项目脚手架中提供的一个做 http 请求的方法，是对于 fetch 的封装，返回 Promise
import request from '../util/request';
const delay = (millisecond) => {
    return new Promise((resolve) => {
        setTimeout(resolve, millisecond);
    });
};
export default {
    namespaces: 'puzzlecards',
    state: {
        data: [],
        counter: 100,
    },
    /*
     * 中间件
     * 用于异步处理等有"副作用"的处理
     * 不能修改state
     * 但是可以调用reducer修改
     */
    effects: {
        * queryInitCards(_, sagaEffects) {
            const {call, put} = sagaEffects;
            // 这个路径现在无法访问
            const endPointURI = '/mock/dev/random_joke';
            const puzzle = yield call(request, endPointURI);
            yield put({type: 'addNewCard', payload: puzzle});
            yield call(delay, 300);
            const puzzle2 = yield call(request, endPointURI);
            yield put({type: "addNewCard", payload: puzzle2});

        }
    },
    //reduces 可以有多个reduce
    //reducer 是一个纯函数，它接受当前的 state 及一个 action 对象。
    // action 对象里面可以包含数据体（payload）作为入参，需要返回一个新的 state。
    // 需要是一个纯粹的函数
    reducers: {
        /**
         * 具体的reduces,
         * 添加卡片
         * state:原来的state
         * {payload:newCard} :数据体
         * 返回新的state
         */
        addNewCard(state, {payload: newCard}) {
            const counter = state.counter + 1;
            const newCardWithId = {...newCard, id: counter};
            const nextData = state.data.concat(newCardWithId);
            // 返回state,因为state变了,dva会调用mapStateToProps重新注入页面数据进行页面渲染
            return {
                data: nextData,
                counter: counter,
            }
        }
    }
}
